package com.huitong.common.core.validator;

import com.huitong.common.core.annotation.File;
import com.huitong.common.core.enums.FileType;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

/**
 * 文件字段参数校验器
 *
 * @author fromdrowning
 * @date 2024/5/19 下午3:34
 */
public class FileValidator implements ConstraintValidator<File, MultipartFile> {

    /**
     * 文件后缀类型集合
     */
    private List<String> fileSuffixList;

    /**
     * 文件大小限制
     */
    private long maxSize;

    /**
     * 是否允许为空
     */
    private boolean allowNull;

    /**
     * 初始化 获取到注解上的参数值
     *
     * @param constraintAnnotation id字段参数校验注解
     */
    @Override
    public void initialize(File constraintAnnotation) {
        FileType type = constraintAnnotation.type();
        this.fileSuffixList = type.getFileSuffixList();
        this.maxSize = type.getMaxSize();
        this.allowNull = constraintAnnotation.allowNull();
    }

    /**
     * 参数校验
     *
     * @param file                       文件字段的值
     * @param constraintValidatorContext 校验器上下文
     * @return {@code true} 校验成功
     */
    @Override
    public boolean isValid(MultipartFile file, ConstraintValidatorContext constraintValidatorContext) {
        boolean isNullFile = file == null;

        // 允许为空并且文件也为空校验通过
        if (allowNull && isNullFile) {
            return true;
        }

        String filename = file.getOriginalFilename();

        // 文件为空或文件名为空或空字符串校验不通过
        if (isNullFile || filename == null || filename.isEmpty()) {
            return false;
        }

        // 文件后缀和文件大小符合要求校验通过
        for (String fileSuffix : fileSuffixList) {
            if (filename.endsWith(fileSuffix) && (file.getSize() / 1024 / 1024) < maxSize) {
                return true;
            }
        }

        return false;
    }
}
